package cn.marinda.resturants.utils;

import cn.marinda.resturants.enums.EntityJson;
import cn.marinda.resturants.exception.CreateFileException;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.util.ClassUtils;
import org.springframework.util.ResourceUtils;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/** IO的工具类
 * 用于处理简单的IO操作
 */
public class IOUtils {


    /** 创建一个目录
     *
     * @param path 路径
     * @return
     */
    public static boolean createDir(String path){
        File fileDir = new File(path);
        if(fileDir.isDirectory()){
            try{
                fileDir.mkdir();
                return true;
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return false;
    }

    /** 在指定目录下创建一个文件
     *
     * @param path path
     * @param fileName 文件名
     * @return 是否创建成功
     */
    public static File createFile(String path,String fileName){
        File file = new File(path,fileName);
        try{
            if(!file.exists()){
                file.createNewFile();
                return file;
            }
        }catch (Exception e){
         e.printStackTrace();
        }
        return null;
    }

    /** 上传文件至该目录下
     *
     * @param path 路径
     * @param prefix 后缀
     * @return 结果
     */
    public static File uploadFile(String path,String prefix){

        //UUID转换
        String fileName = UUID.randomUUID().toString();
        String file = fileName+prefix;
        File files = createFile(path,file);
        if(files.exists()){
            return files;
        }
        return null;
    }

    /**
     * 定义一个写入数据文件的方法
     *
     * @return
     */

    public static boolean writeFileData(File file, String data) {
        try {
            Files.write(Paths.get(file.getPath()),data.getBytes(StandardCharsets.UTF_8), StandardOpenOption.WRITE);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }


    /**
     * 定义一个追加JSON数据文件的方法
     *
     * @return
     */

    public static boolean appendObjectToJson(File file, Object data) {
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter(file));
            //写入数据
            writer.append(JSON.toJSONString(data));
            writer.close();
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 读取JSON文件数据返回StringBuilder以便交给FastJSON去处理
     *
     * @param file
     * @return
     */
    public static StringBuilder readerJSON(File file) {
        StringBuilder stringBuilder = new StringBuilder();
        try {
            Files.readAllLines(Paths.get(file.getPath())).forEach(stringBuilder::append);
            Stream<String> stream = Files.lines(Paths.get(file.getPath()));
            return stringBuilder;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /** 把一个List<Object> 的集合获取数据
     *
     * @param index index
     * @param objects List对象
     *
     * @return 一个JSONObject
     */
    public static JSONObject parseListJSONObject(List<?> objects,int index){
//        先定义JSONArr 把List<? > 转化成JSONString
        JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(objects));
        return (JSONObject) jsonArray.get(index);
    }

    /** 利用迭代储存所有jsonObject的数据
     *
     * @param objects List object
     * @return jsonObject的数据
     */
    public static List<JSONObject> parseListObject(List<?> objects){
        List<JSONObject> jsonObjects = new ArrayList<>();
        Iterator<Object> jsonArray = JSON.parseArray(JSON.toJSONString(objects)).stream().iterator();
        while(jsonArray.hasNext()){
            JSONObject nextJSONObject = (JSONObject) jsonArray.next();
            jsonObjects.add(nextJSONObject);
        }
        return jsonObjects;
    }


    /** 生成一个显示数据的Json文件
     * @param json type
     * @return true
     */

    public static boolean createDaoJson(EntityJson json,Object[] obj){
        String property = System.getProperty("user.dir");
        String path = property + "/src/main/resources/static/admin/api/" + json.getName() + ".json";
        File file = new File(path);
        try {
            if(file.exists()){
            }else {
                file.createNewFile();
            }

        }catch (Exception e){
            e.printStackTrace();
        }
        String jsonStr = JSON.toJSONString(obj);
        List<Object> jsonObject = JSON.parseArray(jsonStr,Object.class);
        List<?> jsons = parseListObject(jsonObject);
        ApiResult result = new ApiResult(0,ApiResult.SUCCESS_MESSAGE,jsonObject,1000);
        writeFileData(file,JSON.toJSONString(result));
        return true;
    }
}

